/**
 * 文件名：@OnePage.java <br/>
 * 包名：cn.efunbox.afw.core.entity.page <br/>
 * 项目名：afw-core <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.core.entity.page;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

import cn.efunbox.afw.core.exception.AfwRuntimeException;

/**
 * 类名：OnePage  <br />
 *
 * 功能：分页，一页
 *
 * @author xtwin <br />
 * 创建时间：2016年7月28日 上午11:26:12  <br />
 * @version 2016年7月28日
 */
public class OnePage<E> implements Pageable<List<E>> ,Serializable {

	private static final long serialVersionUID = 1L;
	// 默认分页数据条数
	public final static int DEFAULT_PAGE_SIZE = 10;
	
	// 当前页
	private int pageNo = 1;
	
	// 当前页大小
	private int pageSize = DEFAULT_PAGE_SIZE;
	
	// 总条数
	private long totalSize;
	
	// 数据内容
	private List<E> list;

	/**
	 * 构造方法
	 */
	protected OnePage() {
		// 默认构造方法
	}
	
	/**
	 * 构造方法
	 */
	public OnePage(Long totalSize) {
		this(totalSize, null, null);
	}
	
	/**
	 * 构造方法
	 */
	public OnePage(Long totalSize, Integer pageNo) {
		this(totalSize, pageNo, null);
	}
	
	/**
	 * 构造方法
	 */
	public OnePage(Long totalSize, Integer pageNo, Integer pageSize) {
		// 总记录数
		if (null != totalSize) {
			if (totalSize < 0) {
				throw new AfwRuntimeException("totalSize must be not less than zero!");
			}
			this.totalSize = totalSize;
		}
		
		// 当前页码
		if (null != pageNo) {
			if (pageNo < 0) {
				throw new AfwRuntimeException("pageNo must be not less than zero!");
			}
			
			this.pageNo = pageNo;
		}
		
		// 当前页数据条数
		if (null != pageSize) {
			if (pageSize < 0) {
				throw new AfwRuntimeException("pageSize must be not less than zero!");
			}
			
			this.pageSize = pageSize;
		}
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月31日 上午9:27:27<br/>
	 * 
	 * @return <br/>
	 */
	@Override
	public int getTotalNo() {
		return totalSize == 0 ? 1 : (int) ((totalSize / pageSize) + (totalSize % pageSize == 0 ? 0 : 1));
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月31日 上午9:27:27<br/>
	 * 
	 * @return <br/>
	 */
	@Override
	public long getTotalSize() {
		return totalSize;
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月31日 上午9:27:27<br/>
	 * 
	 * @return <br/>
	 */
	@Override
	public int getPageNo() {
		return pageNo > getTotalNo() ? getTotalNo() : pageNo;
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月31日 上午9:27:27<br/>
	 * 
	 * @return <br/>
	 */
	@Override
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月31日 上午9:27:27<br/>
	 * 
	 * @return <br/>
	 */
	@Override
	public boolean hasNext() {
		return getPageNo() < getTotalNo();
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年7月31日 上午9:27:27<br/>
	 * 
	 * @return <br/>
	 */
	@Override
	public boolean hasPrevious() {
		return getPageNo() > 1;
	}

	/**
	 * @version 2016年7月31日-上午10:57:49
	 */
	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}

	/**
	 * @version 2016年7月31日-上午10:57:49
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * @version 2016年7月31日-上午10:57:49
	 */
	public void setTotalSize(int totalSize) {
		/*if (totalSize < 0) {
			throw new AfwRuntimeException("totalSize must be not less than zero!");
		}*/
		this.totalSize = totalSize;
	}
	
	/**
	 * 功能：bean规范 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年7月31日 下午12:54:59 <br/>
	 */
	public boolean isHasNext() {
		return hasNext();
	}
	
	/**
	 * 功能：bean规范 <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年7月31日 下午12:55:22 <br/>
	 */
	public boolean isHasPrevious() {
		return hasPrevious();
	}

	/**
	 * @version 2016年8月1日-上午10:00:32
	 */
	public void setList(List<E> list) {
		this.list = list;
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年8月1日 上午9:49:32<br/>
	 * 
	 * @return <br/>
	 * @see cn.efunbox.afw.core.entity.page.Pageable#getList()
	 */
	@Override
	public List<E> getList() {
		return null == list ? Collections.emptyList() : list;
	}

	/**
	 * 功能: <br/>
	 * 
	 * 重写：xtwin <br/>
	 * 
	 * @version ：2016年8月1日 上午10:05:48<br/>
	 * 
	 * @return <br/>
	 * @see cn.efunbox.afw.core.entity.page.Pageable#getStart()
	 */
	@Override
	public long getStart() {
		return (getPageNo() - 1) * getPageSize();
	}
}
